package middleware

import (
	"github.com/gin-gonic/gin"
	"interview/pkg/common"
	"interview/pkg/global"
	"interview/pkg/response"
	"net/http"
)

func Transaction(c *gin.Context) {
	method := c.Request.Method
	noTransaction := false

	// OPTIONS/GET方法 以及 未配置事务时不创建事务
	if method == "OPTIONS" || method == "GET" || !global.Conf.System.EnableTransaction {
		noTransaction = true
	}

	defer func() {
		tx := global.GetGlobalTx(c)
		if err := recover(); err != nil {
			// 是自定义响应结果
			if resp, ok := err.(response.Response); ok {
				if !noTransaction {
					// 开启了事务
					if resp.Code == common.SUCCESS || resp.Code == http.StatusOK {
						// 有效的请求，提交事务
						tx.Commit()
					} else {
						tx.Rollback()
					}
				}
				c.JSON(http.StatusOK, resp)
				c.Abort()
				return
			}
			// 出现异常
			if !noTransaction {
				tx.Rollback()
			}
			// 交给异常处理中间件
			panic(err)
		} else {
			// 未出现异常，提交事务
			if !noTransaction {
				tx.Commit()
			}
		}
		c.Abort()
	}()

	if !noTransaction {
		tx := global.Db.Begin()
		c.Set("tx", tx)
	}
	c.Next()
}
